package com.wusiwei.mapper;

import com.wusiwei.entity.Receipt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 收货单数据访问接口
 */
@Mapper
public interface ReceiptMapper {

    /**
     * 获取所有收货单
     *
     * @return 收货单列表
     */
    List<Receipt> getAllReceipts();

    /**
     * 根据ID获取收货单
     *
     * @param id 收货单ID
     * @return 收货单信息
     */
    Receipt getReceiptById(@Param("id") Long id);

    /**
     * 根据订单ID获取关联收货单
     *
     * @param orderId 订单ID
     * @return 收货单列表
     */
    List<Receipt> getReceiptsByOrderId(@Param("orderId") Long orderId);

    /**
     * 插入收货单
     *
     * @param receipt 收货单信息
     * @return 影响行数
     */
    int insertReceipt(Receipt receipt);

    /**
     * 更新收货单
     *
     * @param receipt 收货单信息
     * @return 影响行数
     */
    int updateReceipt(Receipt receipt);

    /**
     * 删除收货单
     *
     * @param id 收货单ID
     * @return 影响行数
     */
    int deleteReceipt(@Param("id") Long id);

    /**
     * 批量删除收货单
     *
     * @param ids 收货单ID列表
     * @return 影响行数
     */
    int batchDeleteReceipt(@Param("ids") List<Long> ids);

    /**
     * 统计收货单数量
     *
     * @param params 查询参数
     * @return 收货单数量
     */
    long countReceipts(Map<String, Object> params);

    /**
     * 分页查询收货单
     *
     * @param params 查询参数
     * @return 收货单列表
     */
    List<Receipt> getReceiptPage(Map<String, Object> params);

    /**
     * 根据参数查询收货单
     *
     * @param params 查询参数
     * @return 收货单列表
     */
    List<Receipt> getReceiptsByParams(Map<String, Object> params);

    /**
     * 获取收货单总金额
     *
     * @return 收货单总金额
     */
    BigDecimal getTotalReceiptAmount();

    /**
     * 获取按供应商统计的收货单数据
     *
     * @param limit 限制返回的供应商数量
     * @return 按供应商统计的收货单数据
     */
    List<Map<String, Object>> getReceiptStatsBySupplier(@Param("limit") int limit);

    /**
     * 按状态统计收货单
     *
     * @return 状态统计结果
     */
    List<Map<String, Object>> countByStatus();

    /**
     * 计算收货单总金额
     *
     * @return 总金额
     */
    BigDecimal sumTotalAmount();

    /**
     * 获取当月收货单数量
     *
     * @return 当月收货单数量
     */
    int countByCurrentMonth();

    /**
     * 获取当月收货单金额
     *
     * @return 当月收货单金额
     */
    BigDecimal sumAmountByCurrentMonth();

//    /**
//     * 按月统计收货单金额
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 统计结果
//     */
//    List<Map<String, Object>> sumAmountGroupByMonth(@Param("startDate") LocalDate startDate,
//                                                    @Param("endDate") LocalDate endDate);

    /**
     * 根据供应商和金额范围查询收货单
     *
     * @param supplierName 供应商名称
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 收货单列表
     */
    List<Receipt> findBySupplierAndAmount(@Param("supplierName") String supplierName,
                                          @Param("minAmount") BigDecimal minAmount,
                                          @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 根据近似供应商名称和金额范围查询收货单
     * 使用模糊匹配查询供应商名称相似的收货单
     *
     * @param supplierName 供应商名称（将用于模糊匹配）
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的收货单列表
     */
    List<Receipt> findBySimilarSupplierAndAmount(@Param("supplierName") String supplierName,
                                                 @Param("minAmount") BigDecimal minAmount,
                                                 @Param("maxAmount") BigDecimal maxAmount);

//    /**
//     * 按供应商统计收货单
//     */
//    List<Map<String, Object>> countBySupplier();

    /**
     * 获取指定年份的月度收货单趋势数据
     *
     * @param year 年份
     * @return 月度趋势数据，包含每月的收货单数量和金额
     */
    List<Map<String, Object>> getMonthlyTrend(@Param("year") int year);

    /**
     * 根据订单编号查询收货单
     *
     * @param orderNumber 订单编号
     * @return 收货单列表
     */
    List<Receipt> findByOrderNumber(@Param("orderNumber") String orderNumber);
} 